﻿using System;
using System.Windows;
using TouchSocket.Sockets;
using TouchSocket.Core;


namespace UdpListenerDemo
{
    public partial class MainWindow : Window
    {
        private UdpSession udpServer;  // 创建一个 UdpSession 实例用于处理 UDP 通信

        // 构造函数
        public MainWindow()
        {
            InitializeComponent();  // 初始化组件
            Closed += (s, e) => udpServer?.Dispose();  // 当窗口关闭时，释放 UDP 会话资源
        }

        // 启动按钮点击事件
        private void BtnStart_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                // 如果已有UDP服务器，先停止并释放资源
                if (udpServer != null)
                {
                    udpServer.Stop();  // 停止接收数据
                    udpServer.Dispose();  // 释放资源
                }

                // 创建一个新的 UdpSession 实例
                udpServer = new UdpSession();  // 确保正确初始化

                // 注册 UDP 数据接收事件
                udpServer.Received += OnUdpDataReceived; // 绑定数据接收事件

                // 配置并启动 UDP 服务器
                udpServer.Setup(new TouchSocketConfig()
                    .SetBindIPHost(new IPHost(50789)));

                // 在这里调用 Start 方法启动 UDP 服务
                udpServer.Start();  // 启动 UDP 服务器开始监听

                // 在日志区域显示 UDP 监听已启动的信息
                AddLog("UDP监听已启动（端口：50789）");
            }
            catch (Exception ex)
            {
                // 如果启动失败，弹出消息框显示错误信息
                MessageBox.Show($"启动失败：{ex.Message}");
            }
        }



        // 处理接收到的 UDP 数据
        // 处理接收到的 UDP 数据
        private async Task OnUdpDataReceived(object sender, UdpReceivedDataEventArgs e)
        {
            // 将接收到的数据（ByteBlock）转换为字节数组
            var data = e.ByteBlock.ToArray();

            // 将字节数组转换为十六进制字符串，并替换掉中间的破折号
            var hexStr = BitConverter.ToString(data).Replace("-", " ");

            // 获取远程发送端点的字符串表示（包含IP地址和端口）
            var remote = e.EndPoint.ToString();

            // 使用 Dispatcher.Invoke 以线程安全的方式更新 UI
            Dispatcher.Invoke(() =>
            {
                // 向日志区域添加接收到的数据
                AddLog($"来自 [{remote}] 的数据:");
                AddLog(hexStr);

                // 添加分隔线
                AddLog(new string('-', 50));
            });

            // 如果需要，你可以返回一个已完成的任务
            await Task.CompletedTask;
        }



        // 清除日志按钮点击事件
        private void BtnClear_Click(object sender, RoutedEventArgs e)
        {
            txtLog.Clear();  // 清空文本框中的日志内容
        }

        // 向日志区域添加日志信息
        private void AddLog(string message)
        {
            // 在日志文本框中添加当前时间和日志信息
            txtLog.AppendText($"[{DateTime.Now:HH:mm:ss.fff}] {message}\n");

            // 滚动文本框到日志的最新位置
            txtLog.ScrollToEnd();
        }
    }
}

